#include "ModRunProxy.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Proxy/Ticket.h"
#include "Gof23/Gof_Proxy/TicketProxy.h"

//代理模式的ModRun（Proxy）;
ModRunProxy::ModRunProxy()
{
    //模式名称;
    m_strModelName = "代理模式（Proxy）;";
    //模式描述;
    m_strModelDesc = "代理模式：为其它对象提供一种代理以控制这个对象的访问。在某些情况下，\n"
                     "一个对象不适合或者不能直接引用另一个对象，而代理对象可以在客户端和目标对象之间起到中介作用。\n"
                     "代理模式侧重封装对象，并提供给客户端除原有服务的更多服务\n"
                     "职责清晰。真实的角色只负责实现实际的业务逻辑，不用关心其它非本职责的事务，通过后期的代理完成具体的任务。\n"
                     "这样代码会简洁清晰。代理对象可以在客户端和目标对象之间起到中介的作用，这样就保护了目标对象。\n"
                     "扩展性好\n"
                     ;
}

//初始化显示模式;
void ModRunProxy::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunProxy::GetEnum()
{
    return emModRunProxy;
}

//运行模式;
void ModRunProxy::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========代理模式（Proxy） start:=======" };
        std::initializer_list<QString> outListSb{ "=====================================" };
        std::initializer_list<QString> outListEnd{ "========代理模式（Proxy） end:=======" };
        pOutPut->OutPut(outListStart);

        //代理模式（Proxy）;
        //普通售票;
        std::shared_ptr<Ticket> pTicket(new Ticket());
        pTicket->TicketSales();
        pOutPut->OutPut(outListSb);

        //代理售票;
        std::shared_ptr<TicketProxy> pTicketProxy(new TicketProxy(pTicket));
        pTicketProxy->TicketSales();
        
        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunProxy::CreateMe()
{
    return new ModRunProxy();
}
